package es.uned.hoomgle.hibernate.daos.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository;

import es.uned.hoomgle.hibernate.beans.impl.Role;
import es.uned.hoomgle.hibernate.beans.impl.User;
import es.uned.hoomgle.hibernate.beans.interfaces.RoleI;
import es.uned.hoomgle.hibernate.beans.interfaces.UserI;
import es.uned.hoomgle.hibernate.daos.interfaces.UserDaoI;

@Repository(value="userDao") //Soporte para escanear los daos sin tener que declararlos en el xml
			//Y para la traduccion de excepciones.
/**
 * Clase gestora de las entidades de usuario
 * 
 *
 */
public class UserDao extends HoomgleDao implements UserDaoI{
	
	
	
	
	/**
	 * Transforma un objeto de negocio de usario en una entidad de hibernate
	 * @param dto
	 * @return
	 */
	public UserI dtoToEntity (UserI dto){
		UserI user = new User();
		BeanUtils.copyProperties(dto, user);
		if(dto.getRoles()!=null && !dto.getRoles().isEmpty()){
			List roles = new ArrayList();
			for (Object rolObject : dto.getRoles()) {
				RoleI rolDto = (RoleI)rolObject;
				RoleI rol = new Role();
				BeanUtils.copyProperties(rolDto, rol);
				roles.add(rol);
			}
			user.setRoles(roles);			
		}
		return user;
	}
	
	/**
	 * Devuelve un usuario por el nombre de usuario
	 * @param userName
	 * @return
	 */
	public UserI findByUserName(String userName){
		Query query = sessionFactory.getCurrentSession().createQuery("from User where userName = :username");
		query.setParameter("username", userName);
		User user = (User)query.uniqueResult();
		return user;
	}
	
	/**
	 * Obtiene la clase de la entidad
	 * @return
	 */
	public Class<User> getEntityClass(){
		return User.class;
	}
	
	/**
	 * Elimina un usuario
	 */
	public void deleteUser(String userName) {
		UserI user = findByUserName(userName);
		user.getRoles().clear();
		user.getHomeList().clear();
		Session session =sessionFactory.getCurrentSession(); 
		session.delete(user);
		
	}
			
}
